package com.sh.rpc.loadbalancer;

import com.sh.rpc.model.ServiceMetaInfo;

import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 轮询负载均衡算法
 * 采用juc里面的AtomicInteger,保证线程安全
 *
 * @author sh
 */

public class RoundRobinLoadBalancer implements LoadBalancer {
    // 当前索引，使用原子类确保线程安全
    private final AtomicInteger currentIndex = new AtomicInteger(0);

    /**
     * 根据传入的请求参数和服务元信息列表选择一个服务元信息
     * @param requestParams    请求参数的映射
     * @param serviceMetaInfoList 服务元信息列表
     * @return 选择出的服务元信息，如果没有合适的则返回 null
     */
    public ServiceMetaInfo select(Map<String, Object> requestParams, List<ServiceMetaInfo> serviceMetaInfoList) {
        // 如果服务元信息列表为空，则返回 null
        if (serviceMetaInfoList.isEmpty()) {
            return null;
        }
        // 获取服务元信息列表的大小
        int size = serviceMetaInfoList.size();
        // 如果列表中只有一个元素，直接返回这个元素
        if (size == 1) {
            return serviceMetaInfoList.get(0);
        }
        // 轮询算法，通过原子类的 getAndIncrement 方法获取当前索引，并对列表大小取模得到要选择的索引
        int index = currentIndex.getAndIncrement() % size;
        // 根据索引从列表中获取服务元信息并返回
        return serviceMetaInfoList.get(index);
    }
}
